from sklearn import preprocessing
import numpy as np


# 数据归一化和数据标准化都是数据规范化的方式。不同点在于数据归一化会让数据在一个
# [0,1] 或者 [-1,1] 的区间范围内。而数据标准化会让规范化的数据呈现正态分布的情况，所
# 以你可以这么记：归一化的“一”，是让数据在 [0,1] 的范围内。而标准化，目标是让数据
# 呈现标准的正态分布。


# 1. Min-max 规范化
# 在数据变换中，重点是如何将数值进行规范化，有三种常用的规范方法，分别是 Min-Max
# 规范化、Z-Score 规范化、小数定标规范化。其中 Z-Score 规范化可以直接将数据转化为
# 正态分布的情况，当然不是所有自然界的数据都需要正态分布，我们也可以根据实际的情况
# 进行设计，比如取对数 log，或者神经网络里采用的激励函数等。
# 初始化数据，每一行表示一个样本，每一列表示一个特征
# 将数据进行 [0,1] 规范化
x = np.array([  [ 0., -3.,  1.],
                [ 3.,  1.,  2.],
                [ 0.,  1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
minmax_x = min_max_scaler.fit_transform(x)
print(minmax_x)

# 2. Z-Score 规范化
# 在 SciKit-Learn 库中使用 preprocessing.scale() 函数，可以直接将给定数据进行 Z-Score规范化
x = np.array([[ 0., -3.,  1.],
              [ 3.,  1.,  2.],
              [ 0.,  1., -1.]])
# 将数据进行 Z-Score 规范化
scaled_x = preprocessing.scale(x)
print(scaled_x)


# 3. 小数定标规范化
# 我们需要用 NumPy 库来计算小数点的位数
x = np.array([[ 0., -3.,  1.],
              [ 3.,  1.,  2.],
              [ 0.,  1., -1.]])
# 小数定标规范化
j = np.ceil(np.log10(np.max(abs(x))))
scaled_x = x/(10**j)
print(scaled_x)


# 在数据变换中，重点是如何将数值进行规范化，有三种常用的规范方法，分别是 Min-Max
# 规范化、Z-Score 规范化、小数定标规范化。其中 Z-Score 规范化可以直接将数据转化为
# 正态分布的情况，当然不是所有自然界的数据都需要正态分布，我们也可以根据实际的情况
# 进行设计，比如取对数 log，或者神经网络里采用的激励函数等。

